﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DotBusiness.Models;
using DotLink;
using System.Globalization;

namespace JAVALI_Cardapio_Atendimento.Atendimento
{
    public partial class FrmCadastrarPedidoLocal : Form
    {
        public Form Before { get; set; }

        #region Construtor
        public FrmCadastrarPedidoLocal()
        {
            InitializeComponent();
        }
        #endregion

        #region Propriedades
        private Pedido pedidoCadastrado;
        private Boolean salvo = false;
        #endregion

        #region Metodos

        /// <summary>
        /// Carregamento inicial do formulário de Cadastro de Pedidos Locais
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmAtendimentoCadastrarPedidoDelivery_Load(object sender, EventArgs e)
        {
            //Combo de Produtos cadastrados, que vêm preenchido assim que o formulário é inicializado
            string[] produtos = new string[Bag.P_Produtos.Quantity];
            int i = 0;
            Bag.P_Produtos.Each((o) =>
            {
                produtos[i] = o.ToString("Nome");
                i += 1;
                return true;
            });
            cbProdutoPedidoLocal.DataSource = produtos;

            //Combo de Tipos de Pagamento, que vem preenchido assim que o formulário é inicializado
            string[] arrTpPagamento = new string[5];
            arrTpPagamento[0] = "Visa";
            arrTpPagamento[1] = "MasterCard";
            arrTpPagamento[2] = "Electron";
            arrTpPagamento[3] = "SodeXo";
            arrTpPagamento[4] = "Dinheiro";
            cbTipoPagamentoPedidoLocal.DataSource = new BindingSource(arrTpPagamento, null);
        }

        /// <summary>
        /// No clique do botão Adicionar, adiciona um produto ao pedido que está sendo cadastrado
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAdicionarPedidoLocal_Click(object sender, EventArgs e)
        {
            try
            {
                if (!String.IsNullOrEmpty(cbProdutoPedidoLocal.Text))
                {
                    Produto p = Bag.P_Produtos.Find("Nome", cbProdutoPedidoLocal.Text);
                    var qtd = Int32.Parse(txtQuantidadeProduto.Text);
                    Bag.Atendimento.adicionarProdutoPedido(p.Id, pedidoCadastrado.Id, qtd, false);
                    dtCadastroPedidoLocal.DataSource = Bag.MProdutosPedidos_Array(pedidoCadastrado.Id, false);
                }
                else
                {
                    MessageBox.Show("Digite todos os campos para o cadastro!");
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Cadastro não efetuado, tente novamente!");
            }
        }

        /// <summary>
        /// No clique do botão Ok, volta para a tela de Menu de Atendimento
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOkPedidoLocal_Click(object sender, EventArgs e)
        {
            if (dtCadastroPedidoLocal.RowCount < 1)
            {
                MessageBox.Show("Digite todos os campos para o cadastro!");
                return;
            }
            if (!String.IsNullOrEmpty(txtNomeGarcomPedidoLocal.Text) && !String.IsNullOrEmpty(txtNumeroMesaPedidoLocal.Text))
            {
                pedidoCadastrado.Endereco = txtNumeroMesaPedidoLocal.Text;
                pedidoCadastrado.Entregador = txtNomeGarcomPedidoLocal.Text;
                salvo = true;
                this.Before.Show();
                this.Hide();
            }
            else
            {
                MessageBox.Show("Digite todos os campos para o cadastro!");
            }
        }

        /// <summary>
        /// No clique do botão Cancelar, retorna para o Menu de Atendimento e fecha o formulário atual de Cadastro de Pedido Local
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnVoltarMenuAtendimento_Click(object sender, EventArgs e)
        {
            this.Before.Show();
            this.Hide();
        }

        /// <summary>
        /// No clique do link de voltar, retorna para o Menu de Atendimento, e fecha o formulário de Cadastro de Pedido Local
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void linkVoltarMenuAtendimento_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            this.Before.Show();
            this.Hide();
        }

        /// <summary>
        /// No evento de "keypress" (pressionar do teclado), o textbox de quantidade de produtos só permite ser digitado números
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtQuantidadeProduto_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Se o caractere pressionado não for letra, ou seja, se ele for número, permite que seja digitado 
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }

        private void dtCadastroPedidoLocal_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            var data = (MProdutoPedido[])dtCadastroPedidoLocal.DataSource;
            var tempoTotal = from prod in data select (int)((prod.Tempo * prod.Quantidade) / ((prod.Quantidade > 1) ? 2 : 1));
            var tempo = (int)((tempoTotal.Max() + (4 * tempoTotal.Average()) + tempoTotal.Min()) * tempoTotal.Count()) / 6;
            lblSomaTempoPreparoProdutos.Text = ((tempo > 60) ? (int)(tempo / 60) + "" : "00") + ":" + ((tempo < 10) ? "0" + tempo : (tempo % 60) + "") + "";

            var precoTotal = from prod in data select Double.Parse(prod.Preco, NumberStyles.Currency) * prod.Quantidade;
            var preco = precoTotal.Sum();

            lblPrecoTotalResultadoPedidoLocal.Text = String.Format("R${0:0.00}", preco);
        }

        /// <summary>
        /// No evento de "keypress" (pressionar do teclado), o textbox de número da mesa só permite ser digitado números
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtNumeroMesaPedidoLocal_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Se o caractere pressionado não for letra, ou seja, se ele for número, permite que seja digitado 
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }

        private void FrmCadastrarPedidoLocal_VisibleChanged(object sender, EventArgs e)
        {
            if (salvo == false && this.Visible == false)
            {
                Bag.L_Locais.Remove(Bag.L_Locais.Index);
            }
            else if(this.Visible==true)
            {
                //Campos que já vem preenchidos na inicialização do formulário, com as datas e horas atuais
                lblHoraPedidoLocal.Text = DateTime.Now.Hour + " : " + DateTime.Now.Minute;
                lblDataPedidoLocal.Text = DateTime.Now.Day + "/" + DateTime.Now.Month + "/" + DateTime.Now.Year;

                //Ao iniciar o formulário, o textbox de quantidade de produtos já vem com valor inicial 1
                txtQuantidadeProduto.Text = "1";

                pedidoCadastrado = Bag.Atendimento.adicionarPedido(false, "", "", "");
                salvo = false;
            }
        }

        private void FrmCadastrarPedidoLocal_Shown(object sender, EventArgs e)
        {
            if (Bag.P_Produtos.Quantity < 1)
            {
                this.Hide();
                MessageBox.Show("Não há produtos cadastrados.\n Cadastre um produto primeiro antes de cadastrar um pedido.");
                FrmCadastrarProduto cadProduto = new FrmCadastrarProduto();
                cadProduto.Before = this.Before;
                cadProduto.Show();
                return;
            }
        }
        #endregion
    }
}
